package vip.xiaonuo.bi.core.datasource.enums;

import com.alibaba.fastjson.JSONObject;
import vip.xiaonuo.bi.core.datasource.common.AbstractDataSourceConfig;
import vip.xiaonuo.bi.core.datasource.common.mysql.MysqlConfig;
import vip.xiaonuo.bi.core.datasource.config.ExtendParamConfig;
import vip.xiaonuo.common.exception.CommonException;

/**
 * 数据参数解析封装成 具体的数据源类型配置对象
 */
public enum DataSourceConfigType {

    MySQL(DataSourceType.MySQL.getVal()){
        @Override
        public AbstractDataSourceConfig getDataSourceConfig(JSONObject dataJson, ExtendParamConfig configDTO) {
//            return RdbmsDataSourceConfig
//                    .builder()
//                    // 构建基础配置
//                    .sourceType(MySQL.getVal())
//                    .url(dataJson.getString(DSconstant.JDBC_URL))
//                    .username(dataJson.getString(DSconstant.USERNAME))
//                    .password(dataJson.getString(DSconstant.PASSWORD))
//                    // 存放额外配置
//                    .extendParamConfig(configDTO)
//                    .build();
            return new MysqlConfig().buildDataSourceConfig(dataJson,configDTO);
        }
    };

    private  Integer val;

    DataSourceConfigType(Integer val) {
        this.val = val;
    }

    public Integer getVal() {
        return val;
    }

    /**
     * 定义获取抽象构造具体的数据库配置实例化的方法 每个枚举类型 实现该方法构造具体的数据库类型配置对象
     *
     * @param dataJson
     * @param configDTO
     * @return
     */
    public abstract AbstractDataSourceConfig getDataSourceConfig(JSONObject dataJson, ExtendParamConfig configDTO);


    /**
     * 根据枚举值获取数据源类型
     *
     * @param sourceType 数据源类型
     * @return sourceType
     */
    public static DataSourceConfigType getDataSourceConfigType(Integer sourceType) {
        for (DataSourceConfigType dataSourceConfigType : values()) {
            if (dataSourceConfigType.getVal().equals(sourceType)) {
                return dataSourceConfigType;
            }
        }
        throw new CommonException(String.format("找不到对应的数据源类型, sourceType：%s", sourceType));
    }

}
